# @Filename:    copyAndView
# @Author:      王佳伟
# @Time:        2025-04-08 16:05
# @Describe:    副本和视图
import numpy as np

# 无复制
# 简单的赋值不会创建数组对象的副本。 相反，它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符，类似于 C 中的指针。
#
# 此外，一个数组的任何变化都反映在另一个数组上。 例如，一个数组的形状改变也会改变另一个数组的形状。

a = np.arange(6)
print('我们的数组是：')
print(a)
print('调用id()函数：')
print(id(a))
print('a 赋值给 b：')
b = a
print(b)
print('b拥有相同id()：')
print(id(b))
print('修改b的形状：')
b.shape = 3, 2
print(b)
print('a 的形状也修改了：')
print(a)

print('====================')

# NumPy 拥有ndarray.view()方法，它是一个新的数组对象，并可查看原始数组的相同数据。
# 与前一种情况不同，新数组的维数更改不会更改原始数据的维数。
a = np.arange(6).reshape(3, 2)
print('数组a：')
print(a)
print('创建a的视图：')
b = a.view()
print(b)
print('两个数组的id()不同')
print('a的id():')
print(id(a))
print('b的id():')
print(id(b))

# 修改 b 的形状，并不会修改 a
b.shape = 2, 3
print('b 的形状：')
print(b)
print('a 的形状：')
print(a)

print('====================')

a = np.array([[10, 10], [2, 3], [4, 5]])
print('我们的数组：')
print(a)
print('创建切片：')
s = a[:, :2]
print(s)

print('====================')
# 深复制
# ndarray.copy()函数创建一个深层副本。 它是数组及其数据的完整副本，不与原始数组共享。

a = np.array([[10,10],  [2,3],  [4,5]])
print('数组a：')
print(a)
print('创建a的深层副本：')
b = a.copy()
print('数组b：')
print(b)
# b与a不共享任何内容
print('我们能够写入b来写入a吗？')
print(b is a)
print('修改b的内容：')
b[0, 0] = 100
print('修改后的数组 b：')
print(b)
print('a 保持不变：')
print(a)